🏷️ catégories  /  🚀 projets  /  📰 rss  /  👤 à propos

Dépendences transitives et “unresolved requirement” error dans Liferay

Avec le passage à OSGi, la gestion du classpath ajoute son lot de surprise. Ainsi, on peut voir apparaitre l’erreur suivant lors du déploiement d’un module :

Could not resolve module: com.mbarberot.module.lorem [2008]_  
Unresolved requirement: Import-Package: org.foo.utils_

Dans la plupart des cas, org.foo.utils est le package d’une dépendance ajoutée au module. Par défaut, OSGi va aller chercher ce package dans sa liste de package qui provient des différents Export-Package des modules déployés. Il faut donc lui signifier qu’il s’agit en fait d’un package qu’il doit aller chercher au sein de notre module. Pour cela, nous pouvons ajouter cette instruction au bnd.bnd:

Private-Package: \
org.foo.*

Hélas, c’est alors qu’une nouvelle erreur peut survenir :

Could not resolve module: com.mbarberot.module.lorem [2008]_  
Unresolved requirement: Import-Package: org.bar.annotations_

Pourtant, nulle trace de ce package dans le code ! Il s’agit en fait d’un package utilisé dans org.foo car OSGi va venir également regarder les dépendances transitives !

Hélas, dans ce cas, ajouter le package dans Private-Package ne fonctionnera pas car ce n’est pas notre propre code qui vient importer ce package.

Dans ce cas, on peut venir blacklister ce package dans la partie Import-Package dans le bnd.bnd :

Private-Package: \
org.foo.*
Import-Package: \
!org.bar.*, \
*

Attention à ne pas oublier le wildcard en dernier, sans quoi OSGi n’ira plus chercher aucun package et ne trouvera aucune classe appartenant aux dépendances “provided” : Liferay, vos autres modules, ...